<?php

class Diagnostico 
{

	/* Códigos de "diagnósticos" */
	const DIAG_SINDROME_ANIVERSARIO=0;
	const DIAG_TERRITORIO_PARA_2=1;
	const DIAG_DUELO_DE_ABORTOS=2;
	const DIAG_HIJOS_DE_REEMPLAZO=3;
	const DIAG_NUDO_NARCISISTA=4;
	const DIAG_NUDO_INCESTUOSO=5;
	
	/* Símbolos de "diagnósticos" */
	private $icono_diagnostico = array(
					Diagnostico::DIAG_SINDROME_ANIVERSARIO=>"images/diagnosticos/DIAG_SINDROME_ANIVERSARIO.png",
					Diagnostico::DIAG_TERRITORIO_PARA_2=>"images/diagnosticos/DIAG_TERRITORIO_PARA_2.png",
					Diagnostico::DIAG_DUELO_DE_ABORTOS=>"images/diagnosticos/DIAG_DUELO_DE_ABORTOS.png",
					Diagnostico::DIAG_HIJOS_DE_REEMPLAZO=>"images/diagnosticos/DIAG_HIJOS_DE_REEMPLAZO.png",
					Diagnostico::DIAG_NUDO_NARCISISTA=>"images/diagnosticos/DIAG_NUDO_NARCISISTA.png",
					Diagnostico::DIAG_NUDO_INCESTUOSO=>"images/diagnosticos/DIAG_NUDO_INCESTUOSO.png",										
					);


	/* Símbolos de "diagnósticos" */
	private $texto_diagnostico = array(
					Diagnostico::DIAG_SINDROME_ANIVERSARIO=>"<H2>Síndrome aniversario</H2>",
					Diagnostico::DIAG_TERRITORIO_PARA_2=>"<H2>Territorio para dos</H2>",
					Diagnostico::DIAG_DUELO_DE_ABORTOS=>"<H2>Duelo de abortos</H2>",
					Diagnostico::DIAG_HIJOS_DE_REEMPLAZO=>"<H2>Hijos de reemplazo</H2>",
					Diagnostico::DIAG_NUDO_NARCISISTA=>
					"<H2>Nudo narcisista</H2>
								Esto es una prueba de texto<BR/>.",
					Diagnostico::DIAG_NUDO_INCESTUOSO=>"<H2>Nudo incestuoso</H2>",										
					);
					
					
					
					
	/* Colores para emparejar nombres */
	private $pool_colores = array("800000","008000","000080","808000","008080","800080",
								  "F00000","00F000","0000F0","F0F000","00F0F0","F000F0");

	
	public function texto($diag){
		return $this->texto_diagnostico[$diag] ;
	} 
	
	public function textos() {
		return $this->texto_diagnostico;
	}
	
	/* Recibe un consultante y devuelve un array de los parientes dados de alta
	 * en el árbol del consultante (objetos persona)
	 */
	public function parientesConsultante($consultante){
		$parientesList=parentesco::model()->with('persona')->
					findAllByAttributes(array('tipo'=>$parentesco,'consultanteId'=>$consultante->id));
		return $parientesList;
	}
									 

	/* Devuelve el color del nombre del pariente en relación con todos los otros 
	 * parientes del consultante
	 */
	public function colorNombre($parientesList, $pariente){
		/* Creo un array de nombres únicos*/
		$nombres=array();
		foreach($parientesList as $otroPariente){
			$encontrado=FALSE;
			$indiceNombres=0;
			foreach($nombres as $nombre){
				if ($otroPariente->nombre == $nombre[0]){
					$encontrado=TRUE;
					$nombres[$indiceNombres][1]++;
				}
				$indiceNombres++;
			}
			if (!$encontrado) {
				$nombres[$indiceNombres]=array($otroPariente->nombre,1);
			}
		}		
		/* Recorro la lista de nombres
		 * y asigno un color al actual
		 */
		$color="000000";
		$indiceNombres=0;
		foreach ($nombres as $nombre) {
			if ($pariente->persona->nombre == $nombre[0]){
				if ($nombre[1]>1) {
					$color=$this->pool_colores[$indiceNombres];
					break;
				}
			}
			$indiceNombres++;
		}
		return $color;
	}	
	
	private function enlaceDiagnostico($diagnostico){
		$imagen=CHtml::image($this->icono_diagnostico[$diagnostico]);
		return "<BR/>".CHtml::link($imagen,"javascript:setDiagText(".$diagnostico.");");					
	}
	
	public function esPadre($parentesco_padre,$parentesco_hijo){
		switch ($parentesco_padre) {
			case ArbolHelper::PARENTESCO_MADRE: return ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO); break;
			case ArbolHelper::PARENTESCO_PADRE: return ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO); break;
			case ArbolHelper::PARENTESCO_ABUELO_MATERNO: 
				return (($parentesco_hijo == ArbolHelper::PARENTESCO_MADRE) || ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO_MADRE)  ); break;
			case ArbolHelper::PARENTESCO_ABUELA_MATERNA: 
				return (($parentesco_hijo == ArbolHelper::PARENTESCO_MADRE) || ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO_MADRE)  ); break;
			case ArbolHelper::PARENTESCO_ABUELO_PATERNO: 
				return (($parentesco_hijo == ArbolHelper::PARENTESCO_PADRE) || ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO_PADRE)  ); break;
			case ArbolHelper::PARENTESCO_ABUELA_PATERNA: 
				return (($parentesco_hijo == ArbolHelper::PARENTESCO_PADRE) || ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO_PADRE)  ); break;
			case ArbolHelper::PARENTESCO_PADRE_ABUELO_MATERNO: 
				return (($parentesco_hijo == ArbolHelper::PARENTESCO_ABUELO_MATERNO) || ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO_ABUELO_MATERNO)  ); break;
			case ArbolHelper::PARENTESCO_MADRE_ABUELO_MATERNO: 
				return (($parentesco_hijo == ArbolHelper::PARENTESCO_ABUELO_MATERNO) || ($parentesco_hijo == ArbolHelper::PARENTESCO_HERMANO_ABUELO_MATERNO)  ); break;
			case ArbolHelper::PARENTESCO_PADRE_ABUELA_MATERNA: 
				return (($parentesco_hijo  == ArbolHelper::PARENTESCO_ABUELA_MATERNA) || ($parentesco_hijo  == ArbolHelper::PARENTESCO_HERMANO_ABUELA_MATERNA)  ); break;
			case ArbolHelper::PARENTESCO_MADRE_ABUELA_MATERNA: 
				return (($parentesco_hijo  == ArbolHelper::PARENTESCO_ABUELA_MATERNA) || ($parentesco_hijo  == ArbolHelper::PARENTESCO_HERMANO_ABUELA_MATERNA)  ); break;
			case ArbolHelper::PARENTESCO_PADRE_ABUELO_PATERNO: 
				return (($parentesco_hijo  == ArbolHelper::PARENTESCO_ABUELO_PATERNO) || ($parentesco_hijo  == ArbolHelper::PARENTESCO_HERMANO_ABUELO_PATERNO)  ); break;
			case ArbolHelper::PARENTESCO_MADRE_ABUELO_PATERNO: 
				return (($parentesco_hijo  == ArbolHelper::PARENTESCO_ABUELO_PATERNO) || ($parentesco_hijo  == ArbolHelper::PARENTESCO_HERMANO_ABUELO_PATERNO)  ); break;
			case ArbolHelper::PARENTESCO_PADRE_ABUELA_PATERNA: 
				return (($parentesco_hijo  == ArbolHelper::PARENTESCO_ABUELA_PATERNA) || ($parentesco_hijo  == ArbolHelper::PARENTESCO_HERMANO_ABUELA_PATERNA)  ); break;
			case ArbolHelper::PARENTESCO_MADRE_ABUELA_PATERNA: 
				return (($parentesco_hijo  == ArbolHelper::PARENTESCO_ABUELA_PATERNA) || ($parentesco_hijo  == ArbolHelper::PARENTESCO_HERMANO_ABUELA_PATERNA)  ); break;
			default : return false;
		}	
	}
	
	public function esHermano($parentesco1,$parentesco2){
		switch ($parentesco1) {
			case ArbolHelper::PARENTESCO_MADRE: return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_MADRE); break;
			case ArbolHelper::PARENTESCO_PADRE: return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_PADRE); break;
			case ArbolHelper::PARENTESCO_HERMANO_MADRE: return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_MADRE); break;
			case ArbolHelper::PARENTESCO_HERMANO_PADRE: return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_PADRE); break;
			case ArbolHelper::PARENTESCO_ABUELO_MATERNO: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELO_MATERNO); break;
			case ArbolHelper::PARENTESCO_ABUELA_MATERNA: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELA_MATERNA); break;
			case ArbolHelper::PARENTESCO_ABUELO_PATERNO: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELO_PATERNO); break;
			case ArbolHelper::PARENTESCO_ABUELA_PATERNA: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELA_PATERNA); break;
			case ArbolHelper::PARENTESCO_HERMANO_ABUELO_MATERNO: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELO_MATERNO); break;
			case ArbolHelper::PARENTESCO_HERMANO_ABUELA_MATERNA: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELA_MATERNA); break;
			case ArbolHelper::PARENTESCO_HERMANO_ABUELO_PATERNO: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELO_PATERNO); break;
			case ArbolHelper::PARENTESCO_HERMANO_ABUELA_PATERNA: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO_ABUELA_PATERNA); break;
			case ArbolHelper::PARENTESCO_HERMANO: 
				return ($parentesco2 == ArbolHelper::PARENTESCO_HERMANO); break;
			default : return false;
		}	
	}
	
	public function esHijo($parentesco_hijo,$parentesco_padre){
		return $this->esPadre($parentesco_padre,$parentesco_hijo);
	}
	/* Devuelve si existe una relación de nudo narcisista entre este pariente y otro,
	 * ésto es, que su nombre coincide con el de su padre o con el de alguno de sus hijos 
	 */
	public function nudoNarcisista($parientesOrdenados, $pariente, $parentesco){
		$resultado="";
		foreach($parientesOrdenados as $otroPariente){
			if ($this->esPadre($otroPariente->parentesco->tipo,$parentesco) || $this->esHijo($otroPariente->parentesco->tipo,$parentesco)){
				if ($otroPariente->nombre == $pariente->persona->nombre){
					return $this->enlaceDiagnostico(Diagnostico::DIAG_NUDO_NARCISISTA);
				}
			}
		}		
	}
	
	public function nudoIncestuoso($parientesOrdenados, $pariente, $parentesco) {
		if ($pariente->persona->fecha_nacimiento != null) {
			$dateDiff = time() -  strtotime($pariente->persona->fecha_nacimiento) ;
	   		$years = floor($dateDiff/(60*60*24*365));
	   		if ($years>=18 && $pariente->persona->casado == 0) {
	   			return $this->enlaceDiagnostico(Diagnostico::DIAG_NUDO_INCESTUOSO);
	   		}
		}
	}
	public function sindromeAniversario($parientesOrdenados, $pariente, $parentesco) {
		if ($pariente->persona->fecha_nacimiento!=null){ 
			foreach($parientesOrdenados as $otroPariente){
				if ($pariente->persona->id != $otroPariente->id && 
				    $pariente->persona->fecha_nacimiento == $otroPariente->fecha_nacimiento) {		    	
					return $this->enlaceDiagnostico(Diagnostico::DIAG_SINDROME_ANIVERSARIO).$pariente->persona->fecha_nacimiento;
				}
			}
		}
	}
	public function territorioPara2($parientesOrdenados, $pariente, $parentesco) {
		if ($pariente->persona->fecha_nacimiento!=null){ 
			foreach($parientesOrdenados as $otroPariente){
				if ($otroPariente->fecha_nacimiento!=null){
					if ($pariente->persona->id != $otroPariente->id &&  
						$this->esHermano($otroPariente->parentesco->tipo,$parentesco)){
						$dateDiff = strtotime($otroPariente->fecha_nacimiento) - strtotime($pariente->persona->fecha_nacimiento) ;
	   					$years = abs(floor($dateDiff/(60*60*24*365)));
	   					if ($years<=2) {
							return $this->enlaceDiagnostico(Diagnostico::DIAG_TERRITORIO_PARA_2).$pariente->persona->fecha_nacimiento;
	   					}							
					}
				}
			}
		}	
	}
	public function hijoDeReemplazo($parientesOrdenados, $pariente, $parentesco) {
		$dateReemplazoDiff = 0;
		$dateNacDiff = 0;
		$minDateReemplazoDiff = 0;
		$minDateNacDiff = 0;
		if ($pariente->persona->fecha_nacimiento!=null && $pariente->persona->fecha_fallecimiento==null){ 
			foreach($parientesOrdenados as $otroPariente){
				if ($otroPariente->fecha_nacimiento!=null){
					if ($pariente->persona->id != $otroPariente->id &&  
						$this->esHermano($otroPariente->parentesco->tipo,$parentesco)){
						if ($otroPariente->fecha_fallecimiento == null){
							$dateNacDiff = strtotime($pariente->persona->fecha_nacimiento) - strtotime($otroPariente->fecha_nacimiento);
							$minDateNacDiff == 0 ? $minDateNacDiff = $dateNacDiff: $minDateNacDiff = min($minDateNacDiff, abs($dateNacDiff));
						} else {	
							$dateReemplazoDiff = strtotime($pariente->persona->fecha_nacimiento) - strtotime($otroPariente->fecha_fallecimiento);
							if ($dateReemplazoDiff > 0) {
								$minDateReemplazoDiff == 0 ? $minDateReemplazoDiff = $dateReemplazoDiff : $minDateReemplazoDiff = min($minDateReemplazoDiff, $dateReemplazoDiff);
							} 
						}							
					}
				}
			}
		}	
		if ($minDateReemplazoDiff > 0 && $minDateReemplazoDiff < $minDateNacDiff) {
			return $this->enlaceDiagnostico(Diagnostico::DIAG_HIJOS_DE_REEMPLAZO).$pariente->persona->fecha_nacimiento;
		}
	}
}
